import cv2
import numpy as np

class ImageProcessor:
    """图像预处理模块，负责图像的获取、增强和格式转换"""
    
    def __init__(self):
        """初始化图像处理器"""
        self.max_dim = 640  # 预处理后图像的最大尺寸
    
    def preprocess_image(self, frame, use_equalize=False):
        """使用OpenCV进行图像预处理
        
        Args:
            frame: 输入图像（BGR或RGB格式）
            use_equalize: 是否使用直方图均衡化（默认不使用，避免颜色失真）
        
        Returns:
            预处理后的RGB格式图像
        """
        # 确保输入是RGB格式
        if len(frame.shape) == 3 and frame.shape[2] == 3:
            # 检查是否为BGR格式（通过上下文判断）
            # 从system.py传入的frame已经是RGB格式，无需重复转换
            img_rgb = frame.copy()
        else:
            img_rgb = frame.copy()
        
        # 图像增强：可选的直方图均衡化
        if use_equalize:
            img_yuv = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2YUV)
            img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
            img_enhanced = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2RGB)
        else:
            img_enhanced = img_rgb.copy()
        
        # 调整图像大小以提高处理速度
        height, width = img_enhanced.shape[:2]
        if max(height, width) > self.max_dim:
            scale = self.max_dim / max(height, width)
            img_resized = cv2.resize(img_enhanced, None, fx=scale, fy=scale)
        else:
            img_resized = img_enhanced.copy()
        
        return img_resized
    
    def adjust_brightness_contrast(self, frame, brightness=0, contrast=0):
        """调整图像的亮度和对比度
        
        Args:
            frame: 输入图像
            brightness: 亮度调整值 (-100 to 100)
            contrast: 对比度调整值 (-100 to 100)
        
        Returns:
            调整后的图像
        """
        # 转换为浮动类型以避免溢出
        frame_float = frame.astype(float)
        
        # 调整对比度
        if contrast != 0:
            alpha = 131 * (contrast + 127) / (127 * (131 - contrast))
            frame_float = alpha * frame_float + (127 * (1 - alpha))
        
        # 调整亮度
        frame_float = frame_float + brightness
        
        # 裁剪到有效范围并转换回uint8
        frame_float = np.clip(frame_float, 0, 255)
        return frame_float.astype(np.uint8)
    
    def denoise_image(self, frame, strength=3):
        """去除图像噪声
        
        Args:
            frame: 输入图像
            strength: 去噪强度
        
        Returns:
            去噪后的图像
        """
        # 使用高斯模糊去噪
        return cv2.GaussianBlur(frame, (2*strength+1, 2*strength+1), 0)
    
    def detect_motion(self, prev_frame, current_frame, threshold=30):
        """检测两帧之间的运动
        
        Args:
            prev_frame: 前一帧图像
            current_frame: 当前帧图像
            threshold: 像素差异阈值
        
        Returns:
            运动掩码（二值图像）
        """
        # 转换为灰度图
        prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_RGB2GRAY)
        current_gray = cv2.cvtColor(current_frame, cv2.COLOR_RGB2GRAY)
        
        # 计算帧差
        frame_diff = cv2.absdiff(prev_gray, current_gray)
        
        # 应用阈值获取运动区域
        _, motion_mask = cv2.threshold(frame_diff, threshold, 255, cv2.THRESH_BINARY)
        
        # 对掩码进行形态学操作，去除噪声
        kernel = np.ones((5, 5), np.uint8)
        motion_mask = cv2.morphologyEx(motion_mask, cv2.MORPH_CLOSE, kernel)
        
        return motion_mask

# 注意：不创建全局实例，在实际使用时通过导入类并实例化
# 遵循Java风格的实例化模式，在使用时才创建实例